home *** CD-ROM | disk | FTP | other *** search
/ APC & TCP 4 / APC & TCP 4.iso / games / publicdomain / a / attacks / sources / menuutil.mod < prev    next >
Text File  |  1994-05-14  |  14KB  |  424 lines

  1. IMPLEMENTATION MODULE MenuUtil;
  2.  
  3. IMPORT Intuition, Memory, Rasters, Strings, Tasks;
  4. FROM SYSTEM IMPORT ADDRESS, ADR, BYTE;
  5. FROM System IMPORT HALTX;
  6. FROM TermInOut IMPORT WriteString, WriteLn, WriteInt, WriteCard, WriteHex;
  7. FROM AmigaDosProcess IMPORT Delay;
  8. FROM Intuition IMPORT IDCMPFlagsSet, WindowFlagsSet,
  9.                       MenuFlagsSet, MenuItemFlagsSet, MenuItemMutualExcludeSet,
  10.                       AllocRemember, FreeRemember, MenuItemFlags;
  11. FROM Util IMPORT STRINGPTR, WriteAddress, WriteByte, WriteStringPtr;
  12.  
  13.  
  14. CONST
  15.   MemoryFlags = Memory.MemReqSet{ Memory.MemChip, Memory.MemClear };
  16.   CharWidth   = 8;
  17.   CharHeight  = 8;
  18.  
  19. VAR
  20.   menucount : CARDINAL;      (* This "hack" is used to try to fix the  *)
  21.                              (* offset on the first menu item's select *)
  22.                              (* block. *)
  23.  
  24. (************************************)
  25.  
  26. PROCEDURE CreateStringCopy(     String     : ARRAY OF CHAR;
  27.                             VAR RememberKey: Intuition.RememberPtr ): STRINGPTR;
  28.  
  29. (* Creates a copy of the given string in newly allocated memory and returns
  30.  * pointer to it.  Returns NIL if memory allocation fails.
  31.  *)
  32.  
  33. VAR
  34.   StringPtr : STRINGPTR;
  35. BEGIN
  36.   StringPtr := AllocRemember( RememberKey,
  37.                               Strings.StringLength(String)+1, MemoryFlags );
  38.   IF StringPtr = NIL THEN
  39.     WriteString("Allocation failed in CreateStringCopy"); WriteLn();
  40.     RETURN NIL;
  41.   END;
  42.   Strings.CopyString( StringPtr^, String );
  43.   RETURN StringPtr;
  44. END CreateStringCopy;
  45.  
  46. (************************************)
  47.  
  48. PROCEDURE CreateIText(     StringPtr  : STRINGPTR;
  49.                        VAR RememberKey: Intuition.RememberPtr ) :
  50.                                                      Intuition.IntuiTextPtr;
  51. VAR
  52.   ITextPtr : Intuition.IntuiTextPtr;
  53. BEGIN
  54.   ITextPtr := AllocRemember( RememberKey,
  55.                              SIZE(ITextPtr^), MemoryFlags );
  56.   IF ITextPtr = NIL THEN
  57.     WriteString("Allocation failed in CreateIText"); WriteLn();
  58.     RETURN NIL;
  59.   END;
  60.   ITextPtr^.FrontPen  := BYTE(0);
  61.   ITextPtr^.BackPen   := BYTE(1);
  62.   ITextPtr^.DrawMode  := Rasters.Jam2;
  63.   ITextPtr^.LeftEdge  := 0;
  64.   ITextPtr^.TopEdge   := 1;            (* leave one pixel row above *)
  65.   ITextPtr^.ITextFont := NIL;
  66.   ITextPtr^.IText     := StringPtr;
  67.   ITextPtr^.NextText  := NIL;
  68.   RETURN ITextPtr;
  69. END CreateIText;
  70.  
  71. (************************************)
  72.  
  73. PROCEDURE DumpIntuiText( ITextPtr : Intuition.IntuiTextPtr );
  74. BEGIN
  75.   WriteString("    INTUITEXT DUMP"); WriteLn();
  76.   WriteString("    ITextPtr  = "); WriteAddress( ITextPtr ); WriteLn();
  77.   IF ITextPtr # NIL THEN
  78.     WITH ITextPtr^ DO
  79.       WriteString("    FrontPen  = "); WriteByte( FrontPen, 6 );  WriteLn();
  80.       WriteString("    BackPen   = "); WriteByte( BackPen,  6 );  WriteLn();
  81.       WriteString("    DrawMode  = ");                            WriteLn();
  82.       WriteString("    LeftEdge  = "); WriteInt( LeftEdge,  6 );  WriteLn();
  83.       WriteString("    TopEdge   = "); WriteInt( TopEdge ,  6 );  WriteLn();
  84.       WriteString("    ITextFont = "); WriteAddress( ITextFont ); WriteLn();
  85.       WriteString("    IText     = "); WriteStringPtr( IText );   WriteLn();
  86.       WriteString("    NextText  = "); WriteAddress( NextText );  WriteLn();
  87.       DumpIntuiText( NextText );
  88.     END;  (* WITH *)
  89.   END;  (* IF *)
  90. END DumpIntuiText;
  91.  
  92. (************************************)
  93.  
  94. PROCEDURE DumpItem( ItemPtr : Intuition.MenuItemPtr );
  95. BEGIN
  96.   WriteString("  ITEM DUMP"); WriteLn();
  97.   WriteString("  ItemPtr    = "); WriteAddress( ItemPtr ); WriteLn();
  98.   IF ItemPtr # NIL THEN
  99.     WITH ItemPtr^ DO
  100.       WriteString("  LeftEdge   = "); WriteInt( LeftEdge, 6 );    WriteLn();
  101.       WriteString("  TopEdge    = "); WriteInt( TopEdge , 6 );    WriteLn();
  102.       WriteString("  Width      = "); WriteInt( Width   , 6 );    WriteLn();
  103.       WriteString("  Height     = "); WriteInt( Height  , 6 );    WriteLn();
  104.       WriteString("  Flags      = ");                             WriteLn();
  105.       WriteString("  MutualExcl = ");                             WriteLn();
  106.       WriteString("  Command    = "); WriteByte( Command, 6 );    WriteLn();
  107.       WriteString("  SubItem    = "); WriteAddress( SubItem );    WriteLn();
  108.       WriteString("  ItemFill   = "); WriteAddress( ItemFill );   WriteLn();
  109.       DumpIntuiText( ItemFill );
  110.       WriteString("  SelectFill = "); WriteAddress( SelectFill ); WriteLn();
  111.       DumpIntuiText( SelectFill );
  112.       WriteString("  NextItem   = "); WriteAddress( NextItem );   WriteLn();
  113.       DumpItem( NextItem );
  114.     END;  (* WITH *)
  115.   END;  (* IF *)
  116. END DumpItem;
  117.  
  118. (************************************)
  119.  
  120. PROCEDURE DumpMenu( MenuPtr : Intuition.MenuPtr );
  121. BEGIN
  122.   WriteString("MENU DUMP"); WriteLn();
  123.   WriteString("MenuPtr   = "); WriteAddress( MenuPtr ); WriteLn();
  124.   IF MenuPtr # NIL THEN
  125.     WITH MenuPtr^ DO
  126.       WriteString("MenuName  = "); WriteStringPtr( MenuName ); WriteLn();
  127.       WriteString("LeftEdge  = "); WriteInt( LeftEdge, 6 );    WriteLn();
  128.       WriteString("TopEdge   = "); WriteInt( TopEdge , 6 );    WriteLn();
  129.       WriteString("Width     = "); WriteInt( Width   , 6 );    WriteLn();
  130.       WriteString("Height    = "); WriteInt( Height  , 6 );    WriteLn();
  131.       WriteString("Flags     = ");                             WriteLn();
  132.       WriteString("FirstItem = "); WriteAddress( FirstItem );  WriteLn();
  133.       DumpItem( FirstItem );
  134.       WriteString("NextMenu  = "); WriteAddress( NextMenu );   WriteLn();
  135.       DumpMenu( NextMenu );
  136.     END;  (* WITH *)
  137.   END;  (* IF *)
  138. END DumpMenu;
  139.  
  140. (************************************)
  141.  
  142. PROCEDURE Dump( MenuBarPtr : MENUBARPTR );
  143. BEGIN
  144.   DumpMenu( MenuBarPtr^.FirstMenuPtr );
  145. END Dump;
  146.  
  147. (************************************)
  148.  
  149. PROCEDURE InitMenuBar( VAR MenuBarPtr : MENUBARPTR );
  150.  
  151. BEGIN
  152.   MenuBarPtr := Memory.AllocMem( SIZE(MenuBarPtr^), MemoryFlags );
  153.   IF MenuBarPtr = NIL THEN
  154.     WriteString("Allocation for new menu bar failed"); WriteLn;
  155.   ELSE
  156.     MenuBarPtr^.FirstMenuPtr := NIL;
  157.     MenuBarPtr^.RememberKey  := NIL;
  158.   END;
  159. END InitMenuBar;
  160.  
  161. (************************************)
  162.  
  163. PROCEDURE FindLastMenu(     FirstMenuPtr : Intuition.MenuPtr;
  164.                         VAR MenuPtr      : Intuition.MenuPtr;
  165.                         VAR MenuNumber   : INTEGER            );
  166. BEGIN
  167.   MenuPtr    := FirstMenuPtr;
  168.   MenuNumber := -1;
  169.   IF MenuPtr # NIL THEN
  170.     MenuNumber := 0;
  171.     WHILE MenuPtr^.NextMenu # NIL DO         (* find last menu *)
  172.       MenuPtr := MenuPtr^.NextMenu;
  173.       INC( MenuNumber );
  174.     END;
  175.     (* MenuPtr now points to the last menu *)
  176.   END;
  177. END FindLastMenu;
  178.  
  179. (************************************)
  180.  
  181. PROCEDURE FindLastItem(     FirstItemPtr : Intuition.MenuItemPtr;
  182.                         VAR ItemPtr      : Intuition.MenuItemPtr;
  183.                         VAR ItemNumber   : INTEGER                );
  184. BEGIN
  185.   ItemPtr    := FirstItemPtr;
  186.   ItemNumber := -1;
  187.   IF ItemPtr # NIL THEN
  188.     ItemNumber := 0;
  189.     WHILE ItemPtr^.NextItem # NIL DO         (* find last item *)
  190.       ItemPtr := ItemPtr^.NextItem;
  191.       INC( ItemNumber );
  192.     END;
  193.     (* ItemPtr now points to the last menu *)
  194.   END;
  195. END FindLastItem;
  196.  
  197. (************************************)
  198.  
  199. PROCEDURE AddMenu( MenuBarPtr : MENUBARPTR;
  200.                    MenuName   : ARRAY OF CHAR );
  201. VAR
  202.   LastMenuPtr : Intuition.MenuPtr;
  203.   NewMenuPtr  : Intuition.MenuPtr;
  204.   MenuNumber  : INTEGER;
  205.   MenuNamePtr : STRINGPTR;
  206.  
  207. BEGIN
  208.   MenuNamePtr := CreateStringCopy( MenuName, MenuBarPtr^.RememberKey );
  209.  
  210.   FindLastMenu( MenuBarPtr^.FirstMenuPtr, LastMenuPtr, MenuNumber );
  211.   IF MenuNumber+1 >= Intuition.NoMenu THEN
  212.     WriteString("ERROR in MenuUtil: Too many menus"); WriteLn();
  213.     RETURN;
  214.   END;
  215.  
  216. (*  WriteString("Adding menu: ");  WriteString( MenuNamePtr^ );
  217.  *  WriteCard( MenuNumber+1, 3 );  WriteLn();
  218.  *)
  219.  
  220.   NewMenuPtr := AllocRemember( MenuBarPtr^.RememberKey,
  221.                                SIZE(NewMenuPtr^), MemoryFlags );
  222.   IF NewMenuPtr = NIL THEN
  223.     WriteString("Allocation of menu failed"); WriteLn();
  224.     RETURN;
  225.   END;
  226.   IF LastMenuPtr = NIL THEN
  227.     MenuBarPtr^.FirstMenuPtr := NewMenuPtr;
  228.   ELSE
  229.     LastMenuPtr^.NextMenu := NewMenuPtr;
  230.   END;
  231.  
  232.   NewMenuPtr^.NextMenu  := NIL;
  233.   NewMenuPtr^.Flags